#include "head.h"


// 加载和播放音频的函数
void play_bgm(const char *filename)
{
    // 初始化SDL_mixer
    if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0)
    {
        fprintf(stderr, "SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError());
        return;
    }

    // 加载音乐
    Mix_Music *music = Mix_LoadMUS(filename);
    if (music == NULL)
    {
        fprintf(stderr, "Failed to load music! SDL_mixer Error: %s\n", Mix_GetError());
        return;
    }

    // 播放音乐
    Mix_PlayMusic(music, -1);

    // 注意：不释放音乐和关闭音频，由外部控制
}

//打印飞机进度条
void progress_bar(int seconds)
{
    //加载音乐
    // Mix_Music *music = Mix_LoadMUS("media/bgm.mp3");
    //播放音乐
    play_bgm("media/bgm1.mp3");
    system("clear");                 // 清除屏幕
    const int progress_width = 100;  // 进度条的宽度
    int total_frames = seconds * 10; // 总帧数，假设每秒更新10次
    int frame_duration = 100000;     // 每帧的持续时间（微秒）
    char buffer[progress_width + 4]; // 存储进度条和飞机字符（+3是为了两边的方括号和字符串终止符）

    // 初始化进度条为空格，并在末尾添加方括号和字符串终止符
    memset(buffer, ' ', progress_width);
    buffer[progress_width] = ']';
    buffer[progress_width + 1] = '\0';
    for (int frame_count = 0; frame_count <= total_frames; ++frame_count)
    {
        // 计算当前进度的百分比
        int percent = (frame_count * 100) / total_frames;

        // 计算飞机应该停放的位置（考虑百分比转换为字符位置）
        int plane_pos = (percent * progress_width) / 100;

        // 重新构建进度条，并在适当位置插入飞机字符（'✈'）
        memset(buffer, '=', plane_pos+1); // 用'='填充到飞机位置
        if (plane_pos < progress_width)
        {
            memcpy(buffer + plane_pos+1, "✈", 3); // 插入飞机字符
        }

        // 在字符串开头添加'['
        buffer[0] = '[';

        // 打印进度条和飞机（正确处理颜色）
        printf("\r\033[34m%s\033[0m %d%%", buffer, percent);
        fflush(stdout); // 确保立即输出
        // 等待指定的微秒数
        usleep(frame_duration);
    }
    printf("\n"); // 进度条完成后换行
    // 停止并释放音乐
    Mix_HaltMusic();
    // Mix_FreeALLMusic();
    Mix_CloseAudio();
    return;
}

// 定义判断用户输入错误函数
void juge_in_times(int *num)
{
    // 判断输入次数是否超过三次,超过则需等待三秒
    if (*num == 3)
    {
        *num = 0; // 重新清0,方便下次判断
        system("clear");
        system("cowsay -f ghostbusters \"用户名和密码累计输错3次!请3秒后重新输入!\" | lolcat");
        sleep(3);
        return;
    }
}



// 统计文件行数
int count_line(const char *file_name)
{
    //打开文件
    FILE *fp = fopen(file_name,"r");
    char ch = 0;             //用于遍历字符
    int line_num = 0;       //统计行数
    while (EOF!=(ch=fgetc(fp)))
    {
        if ('\n'==ch)
        {
            line_num++;
        }
        
    }
    fclose(fp);
    return line_num;
}

// 终端居中输出文本
void text_center(char *text, const char *color)
{
    // 假设的终端宽度
    int terminalWidth = 160;
    // 计算字符串长度
    int messageLength = strlen(text);
    // 计算需要填充的空格数，然后除以2，得到左边空格数
    int spaces = (terminalWidth - messageLength) / 2;

    // 打印左侧空格
    for (int i = 0; i < spaces; i++)
    {
        printf(" ");
    }

    // 打印颜色
    printf("%s", color);

    // 打印消息
    printf("%s", text);

    // 重置颜色
    printf("%s", RESET);

    return;
}

// 将当前时间格式化为字符串并存储在提供的数组中  
void getCurrentTimeStr(char *timeStr, size_t size) 
{  
    time_t current_time;  
    time(&current_time); // 获取当前时间  
  
    // 使用strftime将时间格式化为字符串  
    // 注意：%Y-%m-%d %H:%M:%S 是时间格式，你可以根据需要修改它  
    // 例如，如果你想要"年-月-日 时:分:秒"的格式，你可以这样写  
    strftime(timeStr, size, "%Y年%m月%d日-%H时%M分%S秒", localtime(&current_time));
    return;
}

void text_frame(char *text, const char *color)
{
    // 假设的终端宽度
    int terminalWidth = 170;
    int title_size = strlen(text);
    // 计算需要填充的空格数，然后除以2，得到左边空格数

    int title = (terminalWidth - title_size) / 2;
    for (size_t i = 0; i < terminalWidth; i++)
    {
        printf("%s-", color);
    }
    // 打印左侧空格
    printf("\n\n");
    for (int i = 0; i < title + 5; i++)
    {
        printf(" ");
    }
    printf("%s%s\n", color, text);
    printf("\n");
    for (size_t i = 0; i < terminalWidth; i++)
    {
        printf("-");
    }
    puts(" ");

    // 重置颜色
    printf("%s", RESET);

    return;
}

// 防止用户名重复
int is_onlyname(char *name)
{
    //从文件中读取用户信息
    FlightSystem Flight_sys = Sys_init();
    // 用户信息合表
    u_list *list = init_u_list();
    list = merge_link_lists(list, Flight_sys.ADMIN_USER);    // 管理员账户信息文件
    list = merge_link_lists(list, Flight_sys.REGULAR_USER);  // 普通用户信息文件
    list = merge_link_lists(list, Flight_sys.SILVER_USER);   // 银卡会员信息文件 (9折)
    list = merge_link_lists(list, Flight_sys.GOLD_USER);     // 金卡会员信息文件 (8折)
    list = merge_link_lists(list, Flight_sys.PLATINUM_USER); // 白金会员信息文件 (7折)
    //按名字查找,判断用户名是否重复
    if (find_u_node_name(list, name))
    {
        play_bgm(ERO);
        text_center("用户名已存在!\n",RED);
        sleep(1);
        // 停止并释放音乐
        Mix_HaltMusic();
        Mix_CloseAudio();
        return 0;
    }
    return 1;
}

// 退出
void quit()
{
    text_center("按q退出:",GREEN);
    char ch = 0;
    scanf(" %c",&ch);
    return;
}